//
// Created by 86136 on 2025/3/26.
//
#include "../thirdparty/httplib.h"
/*
* cpp-httplib使用阻塞的多线程IO实现多个客户端同时访问的并发操作
*/

std::string str_text;
std::mutex g_mutex;

int progress_1 = -1;    // 玩家1进度
int progress_2 = -1;    // 玩家2进度


int main(int argc, char** argv)
{
    // 从文件读取数据的输入文件流类
    std::ifstream file("text.txt");

    if (!file.good())
    {
        // MessageBox函数是Windows API的一部分，用于显示一个包含消息、标题和按钮的对话框
        // 通常用于向用户显示信息或提示用户进行操作
        MessageBox(nullptr, "无法打开文本文件 text.txt", "启动失败", MB_OK | MB_ICONERROR);
        return -1;
    }

    httplib::Server server;

    server.Post("/login", [&](const httplib::Request& req, httplib::Response& res)
    {
        /*
        * 该函数传入server.Post后成为临界区访问互斥资源std::string g_str 以及玩家进度
        * 若不使用互斥锁控制会出现数据竞争问题
        */
        std::lock_guard<std::mutex> lock(g_mutex);
        // 如果两个量都不为-1，表示两位玩家都已经登录，故返回空
        if (progress_1 >= 0 && progress_2 >= 0)
        {
            res.set_content("-1", "text/plain");
            return;
        }
        // 否则，返回分配的玩家编号
        res.set_content(progress_1 >= 0? "2": "1", "text/plain");
        (progress_1 >= 0)? (progress_2 = 0): (progress_1 = 0);
    });

    server.Post("/update_1", [&](const httplib::Request& req, httplib::Response& res)
    {
        std::lock_guard<std::mutex> lock(g_mutex);
        // 将玩家1当前的打字数量字符串存放在服务端
        progress_1 = std::stoi(req.body);
        // 在响应体中告知玩家2当前的进度
        res.set_content(std::to_string(progress_2), "text/plain");
    });

    server.Post("/update_2", [&](const httplib::Request& req, httplib::Response& res)
    {
        std::lock_guard<std::mutex> lock(g_mutex);
        // 将玩家2当前的打字数量字符串存放在服务端
        progress_2 = std::stoi(req.body);
        // 在响应体中告知玩家1当前的进度
        res.set_content(std::to_string(progress_1), "text/plain");
    });

    server.listen("0.0.0.0", 25565);

    return 0;
}